/**
 * 1 获取用户的收货地址
 *   1 绑定点击事件
 *   2 调用微信小程序内置api 获取用户的收货地址  
 */
import {getSetting,chooseAddress,openSetting,showModal,showToast} from "../../utils/asyncWx.js"
Page({
  data:{
    address:{},
    cart:[],
    allChecked:false,
    totalPrice:0,
    totalNum:0
  },
  onShow(){
    // 获取缓存中的数据
    const address=wx.getStorageSync("address");
    // 获取缓存中的购物车数据
    const cart = wx.getStorageSync("cart")||[];
    this.setData({
      address
    })
    // 计算是否所有商品都被选中
    // every 只要 有一个回调函数返回了false 那么循环将不再执行循环  直接返回false
    // 空数组 调用 every ,返回值就是true
    // const allChecked=cart.length?cart.every(v=>v.checked):false;
    this.setCart(cart);
    
  },
  // 点击获得收货地址
  async handleChooseAddress(){
    // 这是原始的写法，嵌套调用，比较麻烦
    // wx.getSetting({
    //   success: (result)=>{
    //     const scopeAddress = result.authSetting["scope.address"];
    //     if(scopeAddress===true||scopeAddress===undefined){
    //        wx.chooseAddress({
    //           success:(result1)=>{
    //           console.log(result1);
    //         }
    //       });
    //     }else{
    //       // 如果用户之前拒绝过  则重新调用请求
    //       wx.openSetting({
    //         success: (result2)=>{
    //           // 可以调用获取收货地址代码
    //           wx.chooseAddress({
    //             success:(result3)=>{
    //             console.log(result3);
    //           }
    //         });
    //         }
    //       });
    //     }
    //   },
    //   fail: ()=>{},
    //   complete: ()=>{}
    // });

  /**
   * 这里是新的写法
   */
  // 1 获取状态权限
  try {
    const res1 = await getSetting();
    const scopeAddress=res1.authSetting["scope.address"];
    // 2 判断  权限状态 
    if(scopeAddress ===false){
      await openSetting();
      const res2 = await chooseAddress();
      console.log(res2);
    }
    let address = await chooseAddress();
    address.all = address.provinceName+address.cityName+address.countyName+address.detailInfo;
    // 存入到缓存中
    wx.setStorageSync("address",address);
  } catch (error) {
    console.log(error);
  }
},
// 商品的选中事件
handleItemChange(e){
  const goods_id=e.currentTarget.dataset.id;
  let {cart}=this.data;
  let index=cart.findIndex(v=>v.goods_id==goods_id);
  cart[index].checked=!cart[index].checked;
  this.setCart(cart);
},
// 设置购物车状态的同时 重新计算 底部工具栏的数据
setCart(cart){
  let allChecked=true;
  let totalPrice=0;
  let totalNum=0;
  cart.forEach(v=>{
    if(v.checked){
      totalPrice += v.num*v.goods_price;
      totalNum += v.num;
    }else{
      allChecked=false;
    }
  });
  // 同样的，为了避免空数组
  allChecked=cart.length!=0?allChecked:false;
  this.setData({
    cart,
    totalNum,
    totalPrice,
    allChecked
  });
  wx.setStorageSync("cart",cart);
},
handleItemAllCheck(){
  let {cart,allChecked}=this.data;
  allChecked=!allChecked;
  cart.forEach(v=>v.checked=allChecked);
  this.setCart(cart);
},
// 商品数量的编辑功能
async handleItemNumEdit(e){
  // 获取传递过来的参数
  const {operation,id}=e.currentTarget.dataset;
  // 获取购物车数组
  let {cart}=this.data;
  // 找到需要修改的商品的索引，findIndex这种写法十分值得学习!!!!
  const index=cart.findIndex(v=>v.goods_id===id);
  if(cart[index].num===1&&operation===-1){
    // 弹窗提示,过时的写法，改进为用promise进行调用
    // wx.showModal({
    //   title: '提示',
    //   content: '您是否要删除?',
    //   // 加入=>,可以让函数中的this指针，指向外层的函数
    //   success :(res) => {
    //     if (res.confirm) {
    //       // 删除cart中的元素,删除1个
    //       cart.splice(index,1);
    //       this.setCart(cart);
    //     } else if (res.cancel) {
    //       console.log('用户点击取消')
    //     }
    //   }
    // });
    const res=await showModal({content:"您是否要删除?"});
    if (res.confirm) {
      // 删除cart中的元素,删除1个
      cart.splice(index,1);
      this.setCart(cart);
    }
  }else{
     // 修改cart
    cart[index].num+=operation;
    // 设置回缓存和data
    this.setCart(cart);
  }
},
async handlePay(){
  // 判断收货地址
  const {address,totalNum}=this.data;
  if(!address.userName){
    await showToast({title:"您还没有选择收货地址"});
    return;
  }
  // 判断用户有无选购商品
  if(totalNum===0){
    await showToast({title:"您还没有选购商品"});
    return;
  }

  // 跳转到支付页面
  wx.navigateTo({
    url: '/pages/pay/index'
  });
}
})